<?php
/**
* Codé par Filament le 31 décembre 2010
* Début de la classe dossier, amenée à évoluer, qui permet de gérer facilement et logiquement les dossiers de DMI, qui sont liés au
* contenu du forum.
*
* Mise à jour le 08/01/11 par Filament :
* Maintenant nous avons un chapeau et une catégorie
*
* 07/02/11 par Filament
* Début des corrections de bug à cause de la beta
*
* 24/02/11 par Filament
* Ajout de la gestion des auteurs
* 
* 04/06/2011 par Filament
* gestion des bbcodes.
* Les informations sont tirées du wiki de phpbb.com : http://wiki.phpbb.com/Parsing_text
*/

//Et voici la classe qui gère les dossier
//Rien ne doit être modifié en dehors, c'est cette classe qui assure la logique des données dans la bdd
//En revanche on peut ajouter de nombreuses méthodes dans cette classe pour agir depuis l'extérieur
//Respecter l'encapsulation et donc favoriser private !
include($phpbb_root_path . 'includes/message_parser.' . $phpEx);
include($phpbb_root_path . 'includes/class_categories.' . $phpEx);
class Dossier {
	//Les attribut du dossier :
	private $id;
	private $titre;
	private $chapeau;
	private $create_date;
	private $modif_date;
	private $categorie;
	private $template;
	private $style;
	private $vignette;
	private $auteurs = array();
	private $posts = array();

	//Et hop le constructeur :
	public function __construct() {

		//En fonction du nombre d'arguements on ne va pas dans la même fonction :
		$num=func_num_args();

		switch($num) {
			case 1 :
				$tmp_id = func_get_arg(0);
				$this->initId($tmp_id);
				break;
			case 5 :
				$titre = func_get_arg(0);
				$chapeau = func_get_arg(1);
				$categorie = func_get_arg(2);
				$template = func_get_arg(3);
				$style = func_get_arg(4);
				//PHP 5.3.0 Cette fonction peut maintenant être utilisée dans des listes de paramètres. 
				//Donc on doit faire cette manip pour DMI
				$this->newDossier($titre, $chapeau, $categorie, $template, $style);
				break;
			default :
				break;
		}
	}

	//Initialisation du dossier en fonction de son id :
	private function initId($id) {
		//On récupère la connexion à la bdd déjà établie :
		global $db;

		//Mais de quel dossier peut il bien s'agir ?
		$infos = "SELECT 
						d.dossier_id
						, d.dossier_nom
						, d.dossier_creation_date
						, d.dossier_modif_date
						, d.dossier_chapeau, dossier_cat
						, d.dossier_template
						, d.dossier_style
						, d.vignette
						, c.squelette
						, c.style
					FROM 
						".DOSSIERS_TABLE." d
						, ".CATEGORIES_TABLE." c
					WHERE 
							d.dossier_id = '".$id."'
						AND
							c.id_cat = d.dossier_cat 
					LIMIT 0,1";

		//Bien et maintenant les résutlats :
		$result = $db->sql_query($infos);
		$infos = $db->sql_fetchrow($result);

		//Plopidou pou => on les stocke dans l'objet !
		$this->id = $infos['dossier_id'];
		$this->titre = $infos['dossier_nom'];
		$this->chapeau = $infos['dossier_chapeau'];
		$this->create_date = $infos['dossier_creation_date'];
		$this->modif_date = $infos['dossier_modif_date'];
		$this->categorie = new Categorie($infos['dossier_cat']);
		$this->vignette = $infos['vignette'];
		
		//Concernant le style et le squelette c'est un poil différent mais aps compliqué :
		//Si il y en a un pour le dossier alors ok, sinon on prend celui de la catégorie :
		if(!empty($infos['dossier_template']))
			$this->template = $infos['dossier_template'];
		else
			$this->template = $infos['squelette'];

		if(!empty($infos['dossier_style']))
			$this->style = $infos['dossier_style'];
		else
			$this->style = $infos['style'];
			

		//Mais ? Cette variable prend de la place ! Et j'en ai rien à foutre !
		$db->sql_freeresult($result);
		//Paix à ton ame !

		//Et maintenant la liste des auteurs du dossier !
		$username = "SELECT user_id, username, user_colour, user_avatar, user_avatar_type, user_avatar_height, user_avatar_width, user_sig, user_sig_bbcode_uid, user_sig_bbcode_bitfield, user_from, user_icq, user_aim, user_yim, user_msnm, user_jabber, user_website, user_occ, user_interests, user_bebo, user_blogger, user_goodreads, user_linkedin, user_myspace, user_netlog, user_twitter, user_posts
				FROM ".DOSSIERS_AUTEURS_TABLE." d, ".USERS_TABLE." u
			WHERE d.dossier_id = '".$id."'
			AND u.user_id = d.auteur_id";
		$result = $db->sql_query($username);
		while($user_data = $db->sql_fetchrow($result)) {
			//On encode la signature :
			$bbcode = new bbcode(base64_encode($user_data['user_sig_bbcode_bitfield']));
			$bbcode->bbcode_second_pass($user_data['user_sig'], $user_data['user_sig_bbcode_uid'], $user_data['user_sig_bbcode_bitfield']);
			$signature = bbcode_nl2br($user_data['user_sig']);
			$signature = smiley_text($user_data['user_sig']);
	
			//Et on l'ajoute aussi au tableau :
			$this->auteurs[] =  array(
									'user_id' 		=> $user_data['user_id'],
									'username' 		=> $user_data['username'], 
									'user_colour' 	=> $user_data['user_colour'], 
									'user_avatar' 	=> get_user_avatar($user_data['user_avatar'], $user_data['user_avatar_type'], $user_data['user_avatar_width'], $user_data['user_avatar_height']),
									'user_sig'		=> $signature, 
									'user_from'		=> $user_data['user_from'], 
									'user_icq'		=> $user_data['user_icq'], 
									'user_aim'		=> $user_data['user_aim'], 
									'user_yim'		=> $user_data['user_yim'], 
									'user_msn'		=> $user_data['user_msnm'], 
									'user_jabber'	=> $user_data['user_jabber'], 
									'user_website'	=> $user_data['user_website'], 
									'user_occ'		=> $user_data['user_occ'], 
									'user_interests'=> $user_data['user_interests'], 
									'user_bebo'		=> $user_data['user_bebo'], 
									'user_blogger' 	=> $user_data['user_blogger'], 
									'user_goodreads'=> $user_data['user_goodreads'], 
									'user_linkedin' => $user_data['user_linkedin'], 
									'user_myspace' => $user_data['user_myspace'], 
									'user_netlog' 	=> $user_data['user_netlog'], 
									'user_twitter' 	=> $user_data['user_twitter'], 
									'user_posts' 	=> $user_data['user_posts']
								);
		}
		//Ce format nous permet donc d'accédder aux informations du second auteur de cette façon :
		// $this->auteurs[1]['user_id'] pour obtenir son id, et on a stocké le username directement pour ne pas 
		// avoir à faire des requêtes pour le surnom à chaque fois.

		// Die useless variable, die !
		$db->sql_freeresult($result);
		
		//Et pour finir, si on prenait le contenu du dossier ? ooooh oui la bonne idée !
		$sql_posts = "SELECT d.post_id, d.texte, d.bbcode_uid, d.bbcode_bitfield, d.ordre
				FROM ".DOSSIERS_POSTS_TABLE." d
				WHERE d.dossier_id = '".$id."'
				ORDER BY ordre ASC";
		$result = $db->sql_query($sql_posts);
		while($post = $db->sql_fetchrow($result)) {
			//Et hop bbcodisons ce texte :
			$bbcode = new bbcode(base64_encode($post['bbcode_bitfield']));
			$bbcode->bbcode_second_pass($post['texte'], $post['bbcode_uid'], $post['bbcode_bitfield']);
			$texte = bbcode_nl2br($post['texte']);
			$texte = smiley_text($texte);

			//Dans mon dossier je raconte ça, et puis ça et encore ça !
			$this->posts[$post['ordre']] = array("post_id" => $post['post_id'], "texte" => $texte);
			//Non sérieusement pour des explications sur ce code suffit de lire juste au dessus c'est déjà expliqué !'
		}

		//ToDo : Dans l'idéal il resterait à nettoyer les bbcodes ici !

		//I'll be back !
		$db->sql_freeresult($result);

		//yeah mon objet est correctement inialisé !
	}

	//On crée un dossier
	private function newDossier($titre, $chapeau, $categorie, $template, $style) {
		global $db;

		//On prépare la requête :
		$sql_ary = array(
			"dossier_nom"			=> $titre,
			"dossier_chapeau"		=> $db->sql_escape($chapeau),
			"dossier_creation_date"	=> time(),
			"dossier_modif_date"	=> time(),
			"dossier_cat"			=> $categorie,
			"dossier_template"		=> $template,
			"dossier_style"			=> $style
		);
		
		//On ajoute à la bdd :
		$sql = "INSERT INTO ".DOSSIERS_TABLE." " .$db->sql_build_array('INSERT', $sql_ary);
		$db->sql_query($sql);
		
		//On prépare une date de création si y'en n'a pas :
		if(!isset($create_date))
			$createDate = time();

		//On enregistre ça en attribut :
		$this->id = $db->sql_nextid();
		$this->titre = $titre;
		$this->chapeau = $db->sql_escape($chapeau);
		$this->create_date = $createDate;
		$this->modif_date = $createDate;
		$this->categorie = new Categorie($categorie);
		
		//Est ce que soit le template soit le style est vide ?
		if(empty($template)) {
			$sqlTemplate = "SELECT squelette
							FROM ".CATEGORIES_TABLE."
							WHERE
								id_cat = '".$categorie."'";
			$result = $db->sql_query($sqlTemplate);
			$resultTemplate = $db->sql_fetchrow($result);
			$db->sql_freeresult($result);
			$this->template = $resultTemplate['squelette'];
		} else {
			$this->template = $template;
		}
		
		if(empty($style)) {
			$sqlStyle = "SELECT style
						FROM ".CATEGORIES_TABLE."
						WHERE
							id_cat = '".$categorie."'";
			$result = $db->sql_query($sqlStyle);
			$resultStyle = $db->sql_fetchrow($result);
			$db->sql_freeresult($result);
			$this->template = $resultStyle['style'];
		} else {
			$this->style = $style;
		}
	}

	//On ajoute le texte au dossier :
	public function addPost(&$data) {
		global $db;

		//Quelle était la position du dernier post de ce dossier ?
		$ordre_sql = "SELECT ordre
				FROM ".DOSSIERS_POSTS_TABLE."
				WHERE dossier_id ='".$this->id."'
				ORDER BY ordre DESC
				LIMIT 0,1";
		$result = $db->sql_query($ordre_sql);
		$data_result = $db->sql_fetchrow($result);
		$ordre = $data_result['ordre'];

		//On passe le balais :
		$db->sql_freeresult($result);
		unset($data_result);
		
		//Ok maintenant on calcule les bbcodes :
		$text = utf8_normalize_nfc($data['post_text']);
		$uid = $bitfield = $options = ''; //sera modifié par generate_text_for_storage
		$allow_bbcode = $allow_urls = $allow_smilies = true; //On autorise les bbcode les urls et les smilies
		generate_text_for_storage($text, $uid, $bitfield, $options, $allow_bbcode, $allow_urls, $allow_smilies);

		//On prépare la requête d'insertion :
		$sql_ary = array(
			'dossier_id' 		=> $this->id,
			'post_id'			=> $data['post_id'],
			'texte'				=> $text,
			'ordre'				=> $ordre + 1,
			'bbcode_bitfield'	=> $bitfield,
			'bbcode_uid'		=> $uid
		);
		//On ajoute le post à la bdd :
		$sql = "INSERT INTO ".DOSSIERS_POSTS_TABLE."
				 ". $db->sql_build_array("INSERT", $sql_ary);
		$db->sql_query($sql);

		//On ajoute ces informations à l'objet : 
		$bbcode = new bbcode(base64_encode($bitfield));
		$bbcode->bbcode_second_pass($text, $uid, $bitfield);
		$texte = bbcode_nl2br($text);
		$texte = smiley_text($text);

		$this->posts[($ordre+1)] = array("post_id" => $data['post_id'], "texte" => $texte);
		
		//A la place d'anonymous, on met Staff DMI à la demande de Scrooge :
		if($data['poster_id'] == 1 || $data['poster_id'] == "")  {
			$data['poster_id'] = 8;
		}

		//On ajoute un auteur à la bdd :
		$sql = "INSERT INTO ".DOSSIERS_AUTEURS_TABLE."
			(dossier_id, auteur_id)
			VALUES ('".$this->id."', '".$data['poster_id']."')";
		$db->sql_query($sql);

		//Puis on a besoin de son surnom aussi !
		$username = "SELECT user_id, username, user_colour, user_avatar, user_avatar_type, user_avatar_height, user_avatar_width, user_sig, user_sig_bbcode_uid, user_sig_bbcode_bitfield, user_from, user_icq, user_aim, user_yim, user_msnm, user_jabber, user_website, user_occ, user_interests, user_bebo, user_blogger, user_goodreads, user_linkedin, user_myspace, user_netlog, user_twitter, user_posts
				FROM ".USERS_TABLE."
				WHERE user_id = '".$data['poster_id']."'";
		$result = $db->sql_query($username);
		$user_data = $db->sql_fetchrow($result);
		//On passe le balais :
		$db->sql_freeresult($result);
		
		//On encode la signature :
		$bbcode = new bbcode(base64_encode($user_data['user_sig_bbcode_bitfield']));
		$bbcode->bbcode_second_pass($user_data['user_sig'], $user_data['user_sig_bbcode_uid'], $user_data['user_sig_bbcode_bitfield']);
		$signature = bbcode_nl2br($user_data['user_sig']);
		$signature = smiley_text($user_data['user_sig']);

		//Et on l'ajoute aussi au tableau :
		$this->auteurs[] =  array(
								'user_id' 		=> $user_data['user_id'], 
								'username' 		=> $user_data['username'], 
								'user_colour' 	=> $user_data['user_colour'], 
								'user_avatar' 	=> get_user_avatar($user_data['user_avatar'], $user_data['user_avatar_type'], $user_data['user_avatar_width'], $user_data['user_avatar_height']),
								'user_sig'		=> $signature, 
								'user_from'		=> $user_data['user_from'], 
								'user_icq'		=> $user_data['user_icq'], 
								'user_aim'		=> $user_data['user_aim'], 
								'user_yim'		=> $user_data['user_yim'], 
								'user_msn'		=> $user_data['user_msnm'], 
								'user_jabber'	=> $user_data['user_jabber'], 
								'user_website'	=> $user_data['user_website'], 
								'user_occ'		=> $user_data['user_occ'], 
								'user_interests'=> $user_data['user_interests'], 
								'user_bebo'		=> $user_data['user_bebo'], 
								'user_blogger' 	=> $user_data['user_blogger'], 
								'user_goodreads'=> $user_data['user_goodreads'], 
								'user_linkedin' => $user_data['user_linkedin'], 
								'user_myspace' => $user_data['user_myspace'], 
								'user_netlog' 	=> $user_data['user_netlog'], 
								'user_twitter' 	=> $user_data['user_twitter'], 
								'user_posts' 	=> $user_data['user_posts']
							);
	}

	//Remonte le post dans l'ordre du dossier :
	public function moveUpPost($post_id) {
		global $db;

		//Alors déjà on récupère le post précédent :
		$sql = "SELECT post_id, ordre
			FROM ".DOSSIERS_POSTS_TABLE."
			WHERE dossier_id = '".$this->id."'
			AND ordre = (SELECT ordre as tmp_ordre FROM site_dossiers_posts WHERE dossier_id = '".$this->id."' AND post_id = '".$post_id."') - 1";
		$result = $db->sql_query($sql);
		$infos_post = $db->sql_fetchrow($result);

		//On nettoie tant qu'on y pense :
		$db->sql_freeresult($result);

		//Petite protection au cas où il n'y a pas de post précédent
		if(!empty($infos_post)) {
			//Echange dans le sql :
			$updates = "UPDATE ".DOSSIERS_POSTS_TABLE."
					SET ordre = '".$infos_post['ordre']."'
					WHERE post_id = '".$post_id."'
					AND dossier_id = '".$this->id."'";
			$db->sql_query($updates);
			$updates = "UPDATE ".DOSSIERS_POSTS_TABLE."
					SET ordre = '".($infos_post['ordre']+1)."'
					WHERE post_id = '".$infos_post['post_id']."'
					AND dossier_id = '".$this->id."'";
			$db->sql_query($updates);
			//To Do : gérer le cas où ça ne marche pas

			//Echange dans le tableau
			$tmp = $this->posts[$infos_post['ordre']];
			$this->posts[$infos_post['ordre']] = $this->posts[($infos_post['ordre'] + 1)];
			$this->posts[($infos_post['ordre'] + 1)] = $tmp;
		}
	}

	//Descend le post dans l'ordre du dossier :
	public function moveDownPost($post_id) {
		global $db;

		//Alors déjà on récupère le post précédent :
		$sql = "SELECT post_id, ordre
			FROM ".DOSSIERS_POSTS_TABLE."
			WHERE dossier_id = '".$this->id."'
			AND ordre = (SELECT ordre as tmp_ordre FROM site_dossiers_posts WHERE dossier_id = '".$this->id."' AND post_id = '".$post_id."') + 1";
		$result = $db->sql_query($sql);
		$infos_post = $db->sql_fetchrow($result);

		//On nettoie tant qu'on y pense :
		$db->sql_freeresult($result);

		//Petite protection au cas où il n'y a pas de post précédent
		if(!empty($infos_post)) {
			//Echange dans le sql :
			$updates = "UPDATE ".DOSSIERS_POSTS_TABLE."
					SET ordre = '".$infos_post['ordre']."'
					WHERE post_id = '".$post_id."'
					AND dossier_id = '".$this->id."'";
			$db->sql_query($updates);
			$updates = "UPDATE ".DOSSIERS_POSTS_TABLE."
					SET ordre = '".($infos_post['ordre']-1)."'
					WHERE post_id = '".$infos_post['post_id']."'
					AND dossier_id = '".$this->id."'";
			$db->sql_query($updates);
			//To Do : gérer le cas où ça ne marche pas

			//Echange dans le tableau
			$tmp = $this->posts[$infos_post['ordre']];
			$this->posts[$infos_post['ordre']] = $this->posts[($infos_post['ordre'] - 1)];
			$this->posts[($infos_post['ordre'] - 1)] = $tmp;
		}
	}

	//Fonction qui permet de supprimer un auteur :
	public function removeAuteur($auteur_id) {
		global $db;

		//On commence par supprimer dans le sql :
		$sql = "DELETE
			FROM ".DOSSIERS_AUTEURS_TABLE."
			WHERE dossier_id = '".$this->id."'
			AND auteur_id = '".$auteur_id."'";
		$db->sql_query($sql);

		//Et maintenant on le supprime dans le tableau :
		foreach($this->auteurs as $key => $datas) {
			if($datas['user_id'] == $auteur_id)
				unset($this->auteurs[$key]);
		}
	}

	//Fonction qui permet d'ajouter un auteur :
	public function ajoutAuteur($auteur_username, &$erreurs) {
		global $db;

		//Commençons par chercher l'utilisateur :
		$sql = "SELECT user_id, username, user_colour, user_avatar, user_avatar_type, user_avatar_height, user_avatar_width, user_sig, user_sig_bbcode_uid, user_sig_bbcode_bitfield, user_from, user_icq, user_aim, user_yim, user_msnm, user_jabber, user_website, user_occ, user_interests, user_bebo, user_blogger, user_goodreads, user_linkedin, user_myspace, user_netlog, user_twitter, user_posts
				FROM ".USERS_TABLE."
				WHERE username_clean LIKE '".strtolower($auteur_username)."'
				LIMIT 0,1";
		$result = $db->sql_query($sql);
		$user_data = $db->sql_fetchrow($result);
		$user_id = $user_data['user_id'];
		$db->sql_freeresult($result);
		//On teste si on a bien une réponse :
		if($user_id != null) {
			//Ca roule, alors on l'ajoute aux auteurs :
			$sql = "INSERT INTO ".DOSSIERS_AUTEURS_TABLE." (dossier_id, auteur_id)
				VALUES ('".$this->id."', '".$user_id."')";
			$db->sql_query($sql);
			
			//On encode la signature :
			//Et hop bbcodisons ce texte :
			$bbcode = new bbcode(base64_encode($user_data['user_sig_bbcode_bitfield']));
			$bbcode->bbcode_second_pass($user_data['user_sig'], $user_data['user_sig_bbcode_uid'], $user_data['user_sig_bbcode_bitfield']);
			$signature = bbcode_nl2br($user_data['user_sig']);
			$signature = smiley_text($user_data['user_sig']);

			//Et on l'ajoute aussi au tableau :
			$this->auteurs[] =  array(
									'user_id' 		=> $user_id, 
									'username' 		=> $user_data['username'], 
									'user_colour' 	=> $user_data['user_colour'], 
									'user_avatar' 	=> get_user_avatar($user_data['user_avatar'], $user_data['user_avatar_type'], $user_data['user_avatar_width'], $user_data['user_avatar_height']),
									'user_sig'		=> $signature, 
									'user_from'		=> $user_data['user_from'], 
									'user_icq'		=> $user_data['user_icq'], 
									'user_aim'		=> $user_data['user_aim'], 
									'user_yim'		=> $user_data['user_yim'], 
									'user_msn'		=> $user_data['user_msnm'], 
									'user_jabber'	=> $user_data['user_jabber'], 
									'user_website'	=> $user_data['user_website'], 
									'user_occ'		=> $user_data['user_occ'], 
									'user_interests'=> $user_data['user_interests'], 
									'user_bebo'		=> $user_data['user_bebo'], 
									'user_blogger' 	=> $user_data['user_blogger'], 
									'user_goodreads'=> $user_data['user_goodreads'], 
									'user_linkedin' => $user_data['user_linkedin'], 
									'user_myspace' 	=> $user_data['user_myspace'], 
									'user_netlog' 	=> $user_data['user_netlog'], 
									'user_twitter' 	=> $user_data['user_twitter'], 
									'user_posts' 	=> $user_data['user_posts']
								);
		} else {
			//Pas de réponse, on met un message d'erreur :
			$erreurs[] = 'Le surnom que vous avez entr&eacute; n\'est pas valable.';
		}
	}

	//Maintenant les accesseurs :
	//On ne fait pas de setter puisque ceux ci sont entièrement géré par la base de données, ou lors de la création d'un 		// dossier, il est donc nécessairee pour des questions de sécurité de ne pas fournir d'API qui modifie les données des 		// dossiers

	//Donc les Getters :

	public function getId() {
		return $this->id;
	}

	public function getTitre() {
		return $this->titre;
	}

	public function getModifDate() {
		return $this->modif_date;
	}

	public function getCreateDate() {
		return $this->create_date;
	}

	public function getAuteurs() {
		return $this->auteurs;
	}

	public function getPosts() {
		return $this->posts;
	}

	public function getPost($id) {
		return $this->posts[$id];
	}

	public function getNbPosts() {
		return count($this->posts);
	}

	public function getCategorie() {
		return $this->categorie;
	}
	
	public function getFilArianne() {
		return $this->categorie->getFilAriane() . ' -> <a href="dossier.php?dossier='.$this->id.'">'.$this->titre.'</a>';
	}

	public function getChapeau() {
		return $this->chapeau;
	}
	
	public function getTemplate() {
		return $this->template;
	}
	
	public function getStyle() {
		return $this->style;
	}
	
	public function setVignette($urlVignette)
	{
		global $db;
		
		//Requete SQL pour insérer la vignette :
		$setVignette = "UPDATE " . DOSSIERS_TABLE . " d
						SET d.vignette = '".$urlVignette."'
						WHERE dossier_id = " . $this->id . "";
		$result = $db->sql_query($setVignette);
		$db->sql_freeresult($result);
		
		//Et on change notre objet :
		$this->vignette = $urlVignette;
	}
	
	public function getVignette()
	{
		return $this->vignette;	
	}
	}
}
?>